iT邦幫忙

2023 iThome 鐵人賽

DAY 27
0
Cloud Native

AWS AI交易室實戰系列 第 27

Day 27 演算法交易 - 訓練模型

  • 分享至 

  • xImage
  •  

~ 專家是訓練有素的模型 ~

我們今天繼續下一個步驟 - 訓練模型

一樣我們可以從 github 下載程式碼
github: https://github.com/slindevel/modern-aws-marathon

當中 Day26/cloudformation.yaml 檔案建立我們的環境:

$ aws cloudformation create-stack --stack-name algorithmic-trading --template-body file://Day26/cloudformation.yaml --capabilities CAPABILITY_IAM

接著我們一樣開啟 Notebook
進入到 Day27 資料夾下面裡面有個 Train_Model_Forecast.ipynb 將它打開,kernel 選擇 conda_python3

訓練預測模型

在這個筆記本中,我們將訓練一個深度學習模型,該模型基於歷史價格數據,學習下一個交易日是否會觸及目標價格或止損價格,以進行多頭/空頭交易。

模型:

  • 模型名稱:model_long_short_predict
  • 多層感知器(MLP)(前向神經網絡)
  • 3層:輸入、隱藏、輸出
  • 二元分類
  • 輸入:收盤價,SMA(2到16),ROC(2到16)
  • 輸出:在接下來的五天內,多頭或空頭交易是否觸及了2%的利潤目標,而未觸及1.5%的止損點

先建立相關目錄

%run ./init_model.py 'model_long_short_predict'

步驟一: 從 S3 獲取 Day26 建立的資料

這邊省略掉簡單處理資料讀進 dataframe 的程式碼,最後會得出簡單的資料折線圖

...(請參考 github 程式碼: Day27/Train_Model_Forecast.ipynb)
%matplotlib notebook
df["close"].plot()

步驟二:本機端(Notebook Instance環境)資料前置處理

撰寫資料前置處理程式碼

這段程式碼主要是用於進行金融市場數據的預處理,以生成用於機器學習或其他分析模型的輸入數據。下面是程式碼的主要步驟和功能:

匯入必要的Python庫:
numpy(作為 np 別名):用於數字運算。
pandas(作為 pd 別名):用於數據處理和分析。
talib(作為 ta 別名):用於技術分析指標的計算。
math:用於一些數學運算。

使用Pandas的read_csv函數讀取CSV文件 data_orig_file,並將其存儲在DataFrame d 中。同時,該函數也將日期時間列 dt 設置為索引列。接著,打印了 d 的前幾行數據以檢查。
設置了一些變數,包括 repeatCount、repeatStep、lookBack、forwardWindow、profitTarget 和 stopTarget 等,這些變數將在後續的計算中使用。

創建了列名為 hData 的列表,其中包含了即將創建的DataFrame的列名。這些列包括日期時間 dt、收盤價 close、一系列移動平均值(sma)和一系列變化率(roc),以及 long 和 short 兩個列。
創建了一個空的 tData 列表,用於存儲處理後的數據。
開始對數據進行迴圈處理,其中包括以下步驟:

提取日期時間和收盤價。
計算移動平均值(SMA)和變化率(ROC)。
計算特定條件下的 long 和 short 信號,並將它們添加到 inputRec 中。
將處理好的 inputRec 添加到 tData 列表中。
輸出 lCount 和 sCount,這些變數分別表示 long 和 short 信號的計數。

創建一個新的DataFrame df1,並將處理後的數據存儲在其中。同時,將日期時間列 dt 設置為索引列,並刪除了原本的 dt 列。
最後,將處理好的數據存儲為一個新的CSV文件 data_file,同時打印 df1 的前幾行數據和數據的總數。這個新的CSV文件包含了經過處理的金融市場數據,可以用於後續的分析或機器學習模型的訓練。

注意這邊的 close 值是正規化後的值

m1=min(inputRec0)
m2=max(inputRec0)
for a in inputRec0:
    if m2-m1==0:
        inputRec.append(0)
    else:
        inputRec.append((a-m1)/(m2-m1))

這裡,inputRec0 包含了原始的 close 值,m1 是這些值的最小值,m2 是最大值。然後,對每個原始的 close 值 a,計算 (a-m1)/(m2-m1),這樣就將 close 歸一化到 0 到 1 的範圍內。

本機端執行上面寫的程式碼 in a Docker Container

!cp model/{model_name}_prep.py model/train
!chmod 777 model/train
!docker build -t {model_name}_prep .
!docker run -v $(pwd)/local/$model_name:/opt/ml --rm {model_name}_prep train

產生訓練 & 測試資料

一樣產生 train & test 兩組資料,這邊會印出這兩組資料的筆數

步驟3: 訓練你的模型

這邊我們保留原 blog 的程式碼來訓練模型,使用 model.fit() 得到評估結果會是一個 0 ~ 1 的浮點數

...
def generate_model(dataX, dataY, b):
    model=build_classifier()
    model.fit(dataX, dataY, epochs=100, batch_size=1)
    scores = model.evaluate(dataX, dataY, verbose=0)
    print("Training Data %s: %.2f%%" % (model.metrics_names[1], scores[1]*100))
    return model
...

本地端訓練(用 SageMaker 啟動的 Notebook Instance 上面的 docker 進行訓練工作)

最後會輸出 .h5 檔就完成我們可以用來預測的 model file 了

最後別忘了清理資源:

$ aws cloudformation delete-stack --stack-name algorithmic-trading 

參考資料:

https://aws.amazon.com/tw/blogs/industries/algorithmic-trading-on-aws-with-amazon-sagemaker-and-aws-data-exchange/
https://github.com/aws-samples/algorithmic-trading


上一篇
Day 26 - 演算法交易 - 資料準備
下一篇
Day 28 - 演算法交易 - 回溯測試
系列文
AWS AI交易室實戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言